package spring.cloud.eurekaclientuser.genderid;

import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;

import java.util.ArrayList;
import java.util.List;

public class RedisGenerateId {

    private StringRedisTemplate stringRedisTemplate = null;
    // redis中存储 user_table_key
    //hset user_table_key start 0  0未启用1启用
    //hset user_table_key offset 1  从偏移的位置赋值给创建current当前值
    //hset user_table_key step 3   进步3
    //KEYS[1]  是keyList 的传进去的第一个参数  user_table_key
    private String lua =  // ①
            // 获取是否启用标志
            " local start = redis.call('hget', KEYS[1], 'start') \n"
                    // 如果未启用
                    + " if tonumber(start) == 0  then \n"
                    // 获取开始值
                    + " local result = redis.call('hget', KEYS[1], 'offset') \n"
                    // 将当前值设置为开始值
                    + " redis.call('hset', KEYS[1], 'current', result) \n"
                    // 将是否启用标志设置为已经启用（1）
                    + " redis.call('hset', KEYS[1], 'start', '1') \n"
                    // 返回结束
                    + " return result \n"
                    // 结束if语句
                    + " end \n"
                    // 获取当前值
                    + " local current = redis.call('hget', KEYS[1], 'current') \n"
                    // 获取步长
                    + " local step = redis.call('hget', KEYS[1], 'step') \n"
                    // 结算新的当前值
                    + " local result = current + step \n"
                    // 设置新的当前值
                    + " redis.call('hset', KEYS[1], 'current', result) \n"
                    // 返回结果
                    + " return result \n";

    public RedisGenerateId(StringRedisTemplate stringRedisTemplate) {
        this.stringRedisTemplate = stringRedisTemplate;
    }

    public Long getRedisHashId(String keyType){
        // 结果返回为Long
        DefaultRedisScript<Long> rs = new DefaultRedisScript<Long>();
        rs.setScriptText(lua);
        rs.setResultType(Long.class);
        // 定义脚本中的key参数
        List<String> keyList = new ArrayList<>();
        keyList.add(keyType);
        // 执行脚本，并传递参数
        Object result =  stringRedisTemplate.execute(rs, keyList);
        return Long.parseLong(result.toString());
    }
}
